﻿// 功能：渐变色填充辅助类
// 描述：
// 作者：温伟鹏
// 日期：2010/6/8 15:04:17

using System;
using System.Drawing;

namespace MeizuSDK.Drawing
{
    /// <summary>
    /// 渐变色填充辅助类
    /// </summary>
    public sealed class GradientFill
    {
        /// <summary>
        /// 以渐变色填充矩形
        /// </summary>
        /// <remarks>
        /// 此方法封装的是API函数GradientFill
        /// </remarks>
        /// <param name="gr">要进行填充的GDI+绘图图面</param>
        /// <param name="rc">要填充的矩形区域</param>
        /// <param name="startColor">渐变色开始颜色</param>
        /// <param name="endColor">渐变色结束颜色</param>
        /// <param name="fillDir">渐变色的渐变方向</param>
        /// <returns>返回true，表示API函数GradientFill执行成功；false表示执行失败</returns>
        public static bool Fill(
            Graphics gr,
            Rectangle rc,
            Color startColor, Color endColor,
            FillDirection fillDir)
        {

            // 初始化GradientFill函数所需的各种结构体.
            TRIVERTEX[] tva = new TRIVERTEX[2];
            tva[0] = new TRIVERTEX(rc.X, rc.Y, startColor);
            tva[1] = new TRIVERTEX(rc.Right, rc.Bottom, endColor);
            GRADIENT_RECT[] gra = new GRADIENT_RECT[] {
                                     new GRADIENT_RECT(0, 1)};

            // 获得hDC
            IntPtr hdc = gr.GetHdc();

            // PInvoke to GradientFill.
            bool b;

            b = GDIHelper.GradientFill(
                    hdc,
                    tva,
                    (uint)tva.Length,
                    gra,
                    (uint)gra.Length,
                    (uint)fillDir);
            System.Diagnostics.Debug.Assert(b, string.Format(
                "GradientFill failed: {0}",
                System.Runtime.InteropServices.Marshal.GetLastWin32Error()));

            // 释放hDC
            gr.ReleaseHdc(hdc);

            return b;
        }
    }
}
